//package com.moxi.mogublog.redis.service.impl;
//
//import com.moxi.mogublog.redis.service.IRedisService;
//import com.moxi.mogublog.redis.utils.DataTypeConvert;
//import com.moxi.mogublog.redis.vo.RedisInfoVO;
//import org.apache.commons.lang3.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import redis.clients.jedis.Client;
//import redis.clients.jedis.Jedis;
//import redis.clients.jedis.JedisPool;
//
//import java.util.*;
//
///**
// * Jedis：是Redis官方推荐的Java连接开发工具
// *
// * @author Lishuai
// * @version 1.0.0
// * @date 2020-04-21
// */
//@Service
//public class RedisServiceImpl implements IRedisService {
//
//    // https://www.baidu.com/link?url=tegD6m5Uq3kgbYCyTXeNuC6qq9PqVr4oMVXHq7npGi3KpX9UBvSDVHw0oVZ2JkLtDrONBEUM6dI0tuyS0xErsa&wd=&eqid=d3559ec2004a5884000000065e496d3b
//
//    // keys的类型为List或Set: new String[keys.size()] 等效于 new String[]{}
//
//    /**
//     * log 变量不可变，读取速度快
//     */
//    private static final Logger log = LoggerFactory.getLogger(RedisServiceImpl.class);
//
//    private static final String EmptyString = "";
//
//    /**
//     * 换行符
//     */
//    private static String separator = System.getProperty("line.separator");
//
//    private String redisDbSize = "RedisDBSize";
//    private String usedMemory = "used_memory";
//    private String colon = ":";
//
//    @Autowired
//    private JedisPool jedisPool;
//
//    @Override
//    public List<RedisInfoVO> getRedisInfo() {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            Client client = jedis.getClient();
//            client.info();
//            String info = client.getBulkReply();
//            List<RedisInfoVO> redisInfoVOList = new ArrayList<>();
//            String[] strings = Objects.requireNonNull(info).split(separator);
//            RedisInfoVO redisInfoVO;
//            if (strings.length > 0) {
//                for (String str : strings) {
//                    redisInfoVO = new RedisInfoVO();
//                    String[] strArr = str.split(colon);
//                    if (strArr.length > 1) {
//                        String key = strArr[0];
//                        String value = strArr[1];
//                        redisInfoVO.setKey(key);
//                        redisInfoVO.setValue(value);
//                        redisInfoVOList.add(redisInfoVO);
//                    }
//                }
//            }
//            return redisInfoVOList;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Object eval(String script, List<String> keys, List<String> args) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            Object obj = jedis.eval(script, keys, args);
//            return obj;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String ping() {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.ping();
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public Map<String, Object> getKeysSize() {
//        Jedis jedis = null;
//        try {
//            Map<String, Object> map = new HashMap<>(1);
//            jedis = jedisPool.getResource();
//            Client client = jedis.getClient();
//            client.dbSize();
//            map.put(redisDbSize, client.getIntegerReply());
//            return map;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public Map<String, Object> getMemoryInfo() {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            Client client = jedis.getClient();
//            client.info();
//            String memoryInfo = client.getBulkReply();
//            String[] strArray = Objects.requireNonNull(memoryInfo).split(separator);
//            Map<String, Object> map = null;
//            for (String str : strArray) {
//                String[] detail = str.split(colon);
//                if (usedMemory.equals(detail[0])) {
//                    map = new HashMap<String, Object>(1);
//                    map.put(usedMemory, detail[1].substring(0, detail[1].length() - 1));
//                    break;
//                }
//            }
//            return map;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public Set<String> getKeys(String pattern) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.keys(pattern);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String flushDB() {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.flushDB();
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String flushAll() {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.flushAll();
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> boolean exists(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.exists(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String type(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.type(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long ttl(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.ttl(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long pttl(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.pttl(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long expire(String key, Integer seconds) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.expire(key, seconds);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long pExpire(String key, Long milliSeconds) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.pexpire(key, milliSeconds);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String set(String key, T value, int seconds) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            String str = DataTypeConvert.beanToString(value);
//            if (str == null || str.length() <= 0) {
//                return null;
//            }
//            String result;
//            if (seconds <= 0) {
//                result = jedis.set(key, str);
//            } else {
//                result = jedis.setex(key, seconds, str);
//            }
//            return result;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> T get(String key, Class<T> clazz) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            String str = jedis.get(key);
//            if (StringUtils.isNotBlank(str)) {
//                return DataTypeConvert.stringToBean(str, clazz);
//            }
//            return null;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long strLen(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.strlen(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public boolean del(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            long ret = jedis.del(key);
//            return ret > 0;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//
//    @Override
//    public <T> Long del(Set<String> keys) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.del(keys.toArray(new String[keys.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long incr(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.incr(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long decr(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.decr(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long incrBy(String key, Long increment) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.incrBy(key, increment);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long decrBy(String key, Long increment) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.decrBy(key, increment);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Boolean hSet(String key, String field, T value, int seconds) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            // 生成真正的key
//            Long ret = jedis.hset(key, field, DataTypeConvert.beanToString(value));
//            if (seconds > 0) {
//                jedis.expire(key, seconds);
//            }
//            return ret > 0;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> T hGet(String key, String field, Class<T> clazz) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            String hGet = jedis.hget(key, field);
//            return DataTypeConvert.stringToBean(hGet, clazz);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String hmSet(String key, Map<String, Object> values, int seconds) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            String hmSet = jedis.hmset(key, DataTypeConvert.stringObjectMapToString(values));
//            if (seconds > 0) {
//                jedis.expire(key, seconds);
//            }
//            return hmSet;
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> List<String> hmGet(String key, String field) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hmget(key, field);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> List<String> hmGet(String key, Set<String> fields) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hmget(key, fields.toArray(new String[fields.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Map<String, String> hGetAll(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hgetAll(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long hDel(String key, String field) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hdel(key, field);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long hDel(String key, Set<T> fields) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hdel(key, fields.toArray(new String[fields.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long hIncrBy(String key, String field, long value) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hincrBy(key, field, value);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Boolean hExists(String key, String field) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.hexists(key, field);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long lPush(String key, T value) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            // 生成真正的key
//            return jedis.lpush(key, DataTypeConvert.beanToString(value));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long lPush(String key, List<T> values) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.lpush(key, values.toArray(new String[values.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String lPop(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.lpop(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long rPush(String key, T value) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.rpush(key, DataTypeConvert.beanToString(value));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long rPush(String key, List<T> values) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.rpush(key, values.toArray(new String[values.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> String rPop(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.rpop(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> List<String> lRange(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.lrange(key, 0, -1);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long sAdd(String key, T member) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.sadd(key, DataTypeConvert.beanToString(member));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long sAdd(String key, Set<T> members) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.sadd(key, members.toArray(new String[members.size()]));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Set<String> sMembers(String key) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.smembers(key);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Boolean sIsMember(String key, T member) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.sismember(key, DataTypeConvert.beanToString(member));
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Long zAdd(String key, double score, String member) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.zadd(key, score, member);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public <T> Double zIncrBy(String key, double score, String member) {
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.zincrby(key, score, member);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public void delByKeyPrefix(String keyPrefix) {
//        Jedis jedis = null;
//        keyPrefix += "**";
//        try {
//            jedis = jedisPool.getResource();
//            Set<String> keys = jedis.keys(keyPrefix);
//            if (keys != null && !keys.isEmpty()) {
//                String[] keyArr = new String[keys.size()];
//                jedis.del(keys.toArray(keyArr));
//            }
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    @Override
//    public Set<String> keys(String keyPrefix) {
//        keyPrefix += "**";
//        Jedis jedis = null;
//        try {
//            jedis = jedisPool.getResource();
//            return jedis.keys(keyPrefix);
//        } finally {
//            returnResourceToPool(jedis);
//        }
//    }
//
//    // ------------------------------ 分界线：私有方法 ---------------------------------------------
//
//    /**
//     * 关闭/归还redis连接 [返回资源]
//     *
//     * @param jedis jedis 形式参数
//     */
//    private void returnResourceToPool(Jedis jedis) {
//        if (jedis != null) {
//            // 关闭连接
//            jedis.close();
//        }
//    }
//
//}
